package jech913.basic;

import java.io.IOException;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
import java.sql.Connection;
import java.sql.Driver;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class SungJukV4
 */
// 입력, 수정, 삭제, 조회 서블릿을 따로 따로 생성하지 않고 한꺼번에~
// "/SungJukV4New", "/SungJukV4NewOk": 추가
// "/SungJukV4ReadAll", "/SungJukV4ReadOne": 조회
// "/SungJukV4Update","/SungJukV4UpdateOk": 수정
// "/SungJukV4Delete" : 삭제

@WebServlet(urlPatterns = { "/SungJukV4New", "/SungJukV4NewOk",
		"/SungJukV4ReadAll", "/SungJukV4ReadOne", "/SungJukV4Update",
		"/SungJukV4UpdateOk", "/SungJukV4Delete" })
public class SungJukV4 extends HttpServlet {
	private static final long serialVersionUID = 1L;
	private static final String DRV="oracle.jdbc.OracleDriver";
	private static final String URL="jdbc:oracle:thin:@//112.216.253.122:1521/xe";
	private static final String USR="jech913";
	private static final String PWD="jech913";

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
	 *      response)
	 */
	protected void doGet(HttpServletRequest req, HttpServletResponse res)
			throws ServletException, IOException {
		// 클라이언트의 모든 요청을 SungJukV4 서블릿이 받아 처리함
		// -> front controller 패턴 방식
		// 1. 먼저, 클라이언트의 요청 URI을 받아 분석
		String uri = req.getRequestURI();
		System.out.println(req.getRequestURI());

		if (uri.endsWith("SungJukV4New")) {

			SungJukV4Form(req, res);

		}
		//클라이언트 요청이 post이므로 doPost에서 처리해야 함. 
		/*else if (uri.endsWith("SungJukV4NewOk")) {

			System.out.println("성적 추가완료");

		} */else if (uri.endsWith("SungJukV4ReadAll")) {

			selectAllSungJukV4(req,res);

		} else if (uri.endsWith("SungJukV4ReadOne")) {

			selectOneSungJukV4(req,res);

		} else if (uri.endsWith("SungJukV4Update")) {

			updateSungJukV4(req,res);

		}  else if (uri.endsWith("SungJukV4Delete")) {

			deleteSungJukV4(req,res);

		}
	}
	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
	 *      response)
	 */
	protected void doPost(HttpServletRequest req, HttpServletResponse res)
			throws ServletException, IOException {
		String uri = req.getRequestURI();
		System.out.println(uri);
		
		//클라이언트의 post요청 uri가 SungJukV4NewOk로 끝나면 insertSungJukV4 메서드 호출 
		if(uri.endsWith("SungJukV4NewOk")){
			//성적 데이터 db 추가
			insertSungJukV4(req, res);
		}else if(uri.endsWith("SungJukV4UpdateOk")){
			updateOkSungJukV4(req, res);
		}
		

	}
	// 클라이언트의 요청이 /SungJukV4Form인 경우 처리할 내용
		// 이름, 국어, 영어, 수학을 입력할 수 있도록 html 폼을 작성
		// 입력완료 버튼을 클릭하면 SungJukV4NewOk로 submit함.
	private void SungJukV4Form(HttpServletRequest req, HttpServletResponse res)
				throws IOException {
			res.setContentType("text/html;charset=UTF-8");
			PrintWriter out = res.getWriter();

			out.println("<!DOCTYPE html>");
			out.print("<html>");
			out.print("<head><title> 성적처리 프로그램 v4 </title></head>");
			out.print("<body><h1> 성적처리 프로그램 v4 </h1>");
			//입력완료 버튼 클릭하면 SungJukV4NewOk로 넘어가게끔~ 
			out.print("<form name='sj'method='post' action='./SungJukV4NewOk'>");
			out.print("<div> 이름: <input type='text' name='name'> </div>");
			out.print("<div> 국어: <input type='text' name='kor'> </div>");
			out.print("<div> 영어: <input type='text' name='eng'> </div>");
			out.print("<div> 수학: <input type='text' name='mat'> </div>");
			out.print("<div><button type='submit'> 입력완료 </button>");
			out.print("<button type='reset'> 다시입력 </button></div>");
			out.print("<a href='./SungJukV4ReadAll'> 전체조회 </a>");
			out.print("</form>");
			out.print("</body>");
			out.print("</html>");
		}

	//클라이언트가 입력한 성적데이터를 요청객체로 받은 다음 JDBC를 이용해서 오라클 DB에 추가 
	private void insertSungJukV4(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException{
			
			
			String SQL = "insert into sungjuk(sjno,name,kor,eng,mat,tot,sjavg,grd) values(sjno.nextval, ?, ?, ?, ?,?,?,?)";
			Connection conn = null;
			PreparedStatement ps = null;
			
			//요청객체로부터 입력데이터 가져오기 
			//요청객체 한글처리
			req.setCharacterEncoding("UTF-8");
			String name = req.getParameter("name");
			int kor = Integer.parseInt(req.getParameter("kor"));
			int eng = Integer.parseInt(req.getParameter("eng"));
			int mat = Integer.parseInt(req.getParameter("mat"));

			//총점, 평균, 학점 계산
			int tot = kor + eng + mat;
			float avg = tot/3; 
			String grd="";
			switch((int)avg/10){
			case 10:
			case 9:
				grd = "수";
				break;
			case 8:
				grd = "우";
				break;
			case 7:
				grd = "미";
				break;
			case 6:
				grd = "양";
				break;
			default:
				grd = "가";
				break;
				
			}
			
			//처리된 결과를 sungjuk 테이블에 저장 
			try{			
				Class.forName(DRV); 
				conn = DriverManager.getConnection(URL, USR, PWD); 
				ps = conn.prepareStatement(SQL); 
				ps.setString(1, name);
				ps.setInt(2, kor);
				ps.setInt(3, eng);
				ps.setInt(4, mat);
				ps.setInt(5, tot);
				ps.setFloat(6, avg);
				ps.setString(7, grd);
				int cnt = ps.executeUpdate();
		
			}catch(Exception ex){
				ex.printStackTrace();
			}finally{
				if(ps!=null)try{ps.close();}catch(Exception e){}
				if(conn!=null)try{conn.close();}catch(Exception e){}
			}
			//처리결과를 html 형태로 작성해서 응답으로 출력 
			res.setContentType("text/html;charset=UTF-8");
			PrintWriter out = res.getWriter();

			out.println("<!DOCTYPE html>");
			out.print("<html>");
			out.print("<head><title> 성적 입력결과 </title></head>");
			out.print("<body><h1> 성적 입력결과</h1>");

			out.print("<div> 이름:"+name+"</div>");
			out.print("<div> 국어:"+kor+"</div>");
			out.print("<div> 영어:"+eng+"</div>");
			out.print("<div> 수학:"+mat+"</div>");
			out.print("<div> 총점:"+tot+"</div>");
			out.print("<div> 평균:"+avg+"</div>");
			out.print("<div> 등급:"+grd+"</div>");
			//목록(SungJukV4ReadAll로 이동 )
			out.print("<div><p> <a href='./SungJukV4ReadAll'>목록으로 이동 </a></p></div>");
			out.print("<div><p> <a href='./SungJukV4ReadOne'>상세조회로 이동 </a></p></div>");
			
			out.print("</body>");
			out.print("</html>");
		}
		
		
	//sungjuk 테이블에 저장된 모든 데이터를 간단하게(번호, 이름, 국어, 영어, 수학) 출력
	private void selectAllSungJukV4(HttpServletRequest req,
				HttpServletResponse res) throws ServletException, IOException{
			String SQL="select sjno, name, kor, eng, mat from sungjuk order by sjno asc"; 
			Connection conn = null;
			PreparedStatement ps = null;
			ResultSet rs = null;
			StringBuilder sb = null;
		
			try{
				Class.forName(DRV); 
				conn = DriverManager.getConnection(URL, USR, PWD); 
				ps = conn.prepareStatement(SQL);
				rs = ps.executeQuery();
				sb = new StringBuilder();
				
				while(rs.next()){
					sb.append("<div>")
					  .append(rs.getString(1)).append("  ")
					  .append("<a href='./SungJukV4ReadOne?sjno=")				 
					  .append(rs.getString(1)).append("'>")				 
					  .append(rs.getString(2)).append("</a>")
					  .append(rs.getString(3)).append("  ")
					  .append(rs.getString(4)).append("  ")
					  .append(rs.getString(5)).append("</div>");
			
				}
				
			}catch(Exception ex){
				ex.printStackTrace();
			}finally{
				if(rs!=null)try{rs.close();}catch(Exception e){}
				if(ps!=null)try{ps.close();}catch(Exception e){}
				if(conn!=null)try{conn.close();}catch(Exception e){}
				
			}
			
			
			//결과를 html 형태로 출력
				res.setContentType("text/html;charset=UTF-8");
				PrintWriter out = res.getWriter();

				out.println("<!DOCTYPE html>");
				out.print("<html>");
				out.print("<head><title> 성적 전체조회 </title></head>");
				out.print("<body><h1> 성적 전체조회</h1>");
				out.print(sb.toString());

				out.print("</body>");
				out.print("</html>");
				
			
			
		}
		
	//sungjuk테이블에 저장된 모든 데이터 중 특정 학생에 대해 
	//상세하게(번호,이름,국어,영어,수학,총점,평균,학점,등록일) 출력
	private void selectOneSungJukV4(HttpServletRequest req,
				HttpServletResponse res) throws IOException {
			String SQL = "select * from sungjuk where sjno=?";
			Connection conn = null;
			PreparedStatement ps = null;
			ResultSet rs = null;
			
			StringBuilder sb = null;
			//클라이언트 요청 중 질의문자열에서 sjno 값을 받아 sjno변수에 저장
			String sjno = req.getParameter("sjno");
			
			
			try{
				Class.forName(DRV);
				conn = DriverManager.getConnection(URL, USR, PWD);
				ps = conn.prepareStatement(SQL); 
				ps.setString(1, sjno);
				rs = ps.executeQuery();
				sb = new StringBuilder();
				
				if(rs.next()){
					sb.append("<div>")
					  .append("번호:").append(rs.getString(1))
					  .append("<br>이름:").append(rs.getString(2))
					  .append("<br>국어:").append(rs.getString(3))
					  .append("<br>영어:").append(rs.getString(4))
					  .append("<br>수학:").append(rs.getString(5))
					  .append("<br>총점:").append(rs.getString(6))
					  .append("<br>평균:").append(rs.getString(7))
					  .append("<br>등급:").append(rs.getString(8))
					  .append("<br>등록일:").append(rs.getString(9)).append("</div>");
					 
				}		
				
			}catch(Exception ex){
				ex.printStackTrace();
			}finally{
				if(rs!=null)try{rs.close();}catch(Exception e){}
				if(ps!=null)try{rs.close();}catch(Exception e){}
				if(conn!=null)try{rs.close();}catch(Exception e){}
			}
			
			//결과를 html 형태로 출력
			res.setContentType("text/html;charset=UTF-8");
			PrintWriter out = res.getWriter();

			out.println("<!DOCTYPE html>");
			out.print("<html>");
			out.print("<head><title> 성적 상세조회 </title></head>");
			out.print("<body><h1> 성적 상세조회</h1>");
			out.print(sb.toString());
			out.print("<div><a href='./SungJukV4ReadAll'> 목록으로 </a>");
			//많이 쓰임!!꼭 알아둬
			out.print("<a href='./SungJukV4Update?sjno="+sjno+"'>수정하기 </a>");
			out.print("<a href='javascript:isDelete("+sjno+");'>삭제하기 </a></div>");
			out.print("<script type='text/javascript'>");
			out.print("function isDelete(sjno){");
			out.print("if(confirm('정말로 사실로 삭제?'))");
			//페이지 이동
			out.print("location.href='./SungJukV4Delete?sjno='+sjno;");
			out.print("");
			out.print("}");
			out.print("</script>");
			out.print("</body>");
			out.print("</html>");
			
		}


	private void deleteSungJukV4(HttpServletRequest req, HttpServletResponse res) throws IOException {
			// TODO Auto-generated method stub
			String sjno = req.getParameter("sjno");
			String SQL ="delete from sungjuk where sjno=?";
			Connection conn = null;
			PreparedStatement ps = null;
			
			
			try{
				Class.forName(DRV);
				conn = DriverManager.getConnection(URL, USR, PWD);
				ps = conn.prepareStatement(SQL);
					ps.setString(1, sjno);
				int cnt = ps.executeUpdate();
				
				
			}catch(Exception ex){
				ex.printStackTrace();
			}finally{
				if(ps!=null)try{ps.close();}catch(Exception e){}
				if(conn!=null)try{conn.close();}catch(Exception e){}
			}
			
			//삭제 후 전체 성적 출력(SungJukV4ReadAll) 페이지로 이동 
			res.sendRedirect("./SungJukV4ReadAll");
		}

	
	//수정할 학생의 번호를 입력받아 sungjuk테이블에서 그 학생의 모든 성적데이터를 조회하고
	//결과를 html 폼 형태로 출력
	private void updateSungJukV4(HttpServletRequest req, HttpServletResponse res) throws IOException {
		// TODO Auto-generated method stub
		req.setCharacterEncoding("UTF-8");
		String sjno = req.getParameter("sjno");
		String SQL = "select * from sungjuk where sjno = ?";
		Connection conn = null;
		PreparedStatement ps = null;
		ResultSet rs = null;
		StringBuilder sb= null;
		
		
		try{
			Class.forName(DRV);
			conn = DriverManager.getConnection(URL, USR, PWD);
			ps = conn.prepareStatement(SQL);
				ps.setString(1, sjno);	
				rs = ps.executeQuery();
				sb = new StringBuilder();
				
				if(rs.next()){
					//이름, 국어, 영어, 수학만 수정 
					sb.append("<div>번호:").append(rs.getString(1)).append("</div>")
					  .append("<div>이름:").append("<input type='text' name='name'")
					  		.append("value='").append(rs.getString(2)).append("'></div>")
					  .append("<div>국어:").append("<input type='text' name='kor'")
					  		.append("value='").append(rs.getString(3)).append("'></div>")
					  .append("<div>영어:").append("<input type='text' name='eng'")
					  		.append("value='").append(rs.getString(4)).append("'></div>")
					  .append("<div>수학:").append("<input type='text' name='mat'")
					  		.append("value='").append(rs.getString(5)).append("'></div>")
					  .append("<div>총점: ").append(rs.getString(6)).append("</div>")
					  .append("<div>평균: ").append(rs.getString(7)).append("</div>")
					  .append("<div>학점: ").append(rs.getString(8)).append("</div>")
					  .append("<div>등록일: ").append(rs.getString(9)).append("</div>")
					.append("<input type='hidden' name='sjno' value='").append(sjno).append("'>");
					
				}		
		}catch(Exception ex){
			ex.printStackTrace();
		}finally{
			if(ps!=null)try{ps.close();}catch(Exception e){}
			if(conn!=null)try{ps.close();}catch(Exception e){}
		}
		
		res.setContentType("text/html;charset=UTF-8");
		PrintWriter out = res.getWriter();

		out.println("<!DOCTYPE html>");
		out.print("<html>");
		out.print("<head><title> 성적 수정하기 </title></head>");
		out.print("<body><h1> 성적 수정하기</h1>");
		out.print("<form method='post' action='./SungJukV4UpdateOk'>");
		out.print(sb.toString());
		out.print("<div><button type='submit'> 수정완료 </button>");
		out.print("<button type='button' id='cancelBtn'> 수정취소 </button></div>");
		out.print("</form>");
		
		out.print("<script type='text/javascript'>");

		out.print("var cancelBtn = document.getElementById('cancelBtn');");
		//함수 이름이 없는 함수 = 익명함수
		out.print("cancelBtn.onclick = function(){go2back();};");
		//go2back함수 생성
		out.print("function go2back(){");
		out.print("location.href='./SungJukV4ReadAll';");
		out.print("}");
		out.print("</script>");
		out.print("</body>");
		out.print("</html>");
	}


	
	//학생 성적을 수정하면 수정값뿐만 아니라 모든 값을 다시 입력받아 
	//총점, 평균, 학점을 계산한 후 sungjuk테이블에 저장 
	private void updateOkSungJukV4(HttpServletRequest req,
			HttpServletResponse res) throws IOException {
		// TODO Auto-generated method stub
		req.setCharacterEncoding("UTF-8");
		String sjno = req.getParameter("sjno");
		String SQL = "update sungjuk set name=?, kor=?, eng=?, mat=? where sjno=?";
		Connection conn = null;
		PreparedStatement ps = null;
		
		
		String name = req.getParameter("name");
		
		int kor = Integer.parseInt(req.getParameter("kor"));
		int eng = Integer.parseInt(req.getParameter("eng"));
		int mat = Integer.parseInt(req.getParameter("mat"));
		
		
		
		try{
			
			Class.forName(DRV);
			conn = DriverManager.getConnection(URL, USR, PWD);
			ps = conn.prepareStatement(SQL); 
				ps.setString(1, name);
				ps.setInt(2, kor);
				ps.setInt(3, eng);
				ps.setInt(4, mat);
				ps.setString(5, sjno);
			
			int cnt=ps.executeUpdate();
			
			
		}catch(Exception ex){
			ex.printStackTrace();
		}finally{
			if(ps!=null)try{ps.close();}catch(Exception e){}
			if(conn!=null)try{conn.close();}catch(Exception e){}
		}
		res.sendRedirect("./SungJukV4ReadAll");
	


	}
	
	
	

}
